package com.ylin.coder;

import com.ylin.coder.core.Conf;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * mybatis-plus 生成器
 * @Author masl - 2023/2/22 下午4:01
 */
public class MybatisPlusCreater {
	public static void main(String[] args) {
		Map<String, String> tablesMap = new HashMap<>();
		tablesMap.put("t_addressbook", "t_");
		//tablesMap.put("f_dish", "f_");
		//tablesMap.put("f_dish_flavor", "f_");
		//tablesMap.put("f_setmeal", "f_");
		//tablesMap.put("f_setmeal_dish", "f_");
		//tablesMap.put("f_shopping_cart", "f_");

		Conf conf = new Conf()
				.setOutPath("/home/cnmmmss/codes/")// 代码生成文件夹路径
				.setBasePackageName("com.alin")// 顶级包名
				//.setSubPackageName("sys")// 子包名
				.setCompany("xxxx")// 公司
				.setAuthor("masl")// 当前操作人
				.setTempleteDirName("cloverCode")// 模板文件夹名称
				// -----------数据库相关设置-----------
				.setDbDriver("com.mysql.cj.jdbc.Driver")
				.setDbUrl("jdbc:mysql://127.0.0.1:3306/clover_sit2022")
				.setDbUserNa("root")
				.setDbPwd("123456");

		//获取代码生成器对象
		AutoGenerator autoGenerator = new AutoGenerator();

		//设置数据库相关配置
		DataSourceConfig dataSource = new DataSourceConfig();
		dataSource.setDriverName(conf.getDbDriver());
		dataSource.setUrl(conf.getDbUrl());
		dataSource.setUsername(conf.getDbUserNa());
		dataSource.setPassword(conf.getDbPwd());
		autoGenerator.setDataSource(dataSource);

		//设置全局配置
		GlobalConfig globalConfig = new GlobalConfig();
		globalConfig.setOutputDir(conf.getOutPath());//设置代码输出位置，否则默认输出到D://目录下
		globalConfig.setOpen(false);//设置生成完毕后是否打开生成代码的目录，一般选择false，不需要打开目录
		globalConfig.setAuthor(conf.getAuthor());//作者名字，会在注释中添加作者名字
		globalConfig.setFileOverride(true);//是否覆盖原始生成的文件，选择true后，生成时若原来已有相同文件会自动覆盖，谨慎操作
		globalConfig.setMapperName("%sMapper");//设置数据层接口名，%s为占位符，指代模块名称，默认为"%sMapper"
		globalConfig.setIdType(IdType.AUTO);//设置id生成策略
		autoGenerator.setGlobalConfig(globalConfig);

		//设置包名配置
		PackageConfig packageConfig = new PackageConfig();
		packageConfig.setParent(conf.getBasePackageName());//设置生成的包名，默认为"com.baomidou"
		//packageConfig.setModuleName(conf.getSubPackageName());
		packageConfig.setEntity("model");//设置实体类包名，默认为entity
		packageConfig.setMapper("mapper");//设置数据层包名，默认为mapper
		autoGenerator.setPackageInfo(packageConfig);

		for (String tb : tablesMap.keySet()) {
			try {
				//策略设置
				StrategyConfig strategyConfig = new StrategyConfig();
				strategyConfig.setInclude(tb);//设置参与生成的表名，可填一个或多个
				String tbPrefix = tablesMap.get(tb);
				if(StringUtils.isNotBlank(tbPrefix)) {
					strategyConfig.setTablePrefix(tbPrefix);//设置数据库表名的前缀名称，设置后会省略该前缀
				}
				strategyConfig.setRestControllerStyle(false);//设置是否启用Rest风格
				//strategyConfig.setLogicDeleteFieldName("deleted");//设置逻辑删除字段名，没有就不填
				strategyConfig.setEntityLombokModel(true);//设置是否启用Lombok
				strategyConfig.setEntitySerialVersionUID(true);
				// 包的命名规则，使用驼峰规则
				strategyConfig.setNaming(NamingStrategy.underline_to_camel);
				// 列的名称，使用驼峰规则
				strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
				// 驼峰命名
				strategyConfig.setControllerMappingHyphenStyle(true);
				// 驼峰命名
				strategyConfig.setControllerMappingHyphenStyle(true);
				autoGenerator.setStrategy(strategyConfig);

				//执行生成操作
				autoGenerator.execute();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}
}
